/*
 * Copyright (c) 2023 Cshoo Org. All Rights Reserved.
 */

package org.cshoo.tattoo.datacenter.app;


import org.cshoo.tattoo.datacenter.api.dto.AddTemplateReq;
import org.cshoo.tattoo.datacenter.api.dto.QueryTemplateResp;
import org.cshoo.tattoo.datacenter.api.dto.UpdateTemplateReq;
import org.cshoo.tattoo.datacenter.domain.bo.TemplateBo;
import org.cshoo.tattoo.datacenter.domain.po.Template;
import org.cshoo.tattoo.datacenter.domain.service.TemplateService;
import org.cshoo.tattoo.embed.infra.entity.FileEntity;
import org.cshoo.tattoo.embed.infra.entity.PageQueryEntity;
import org.cshoo.tattoo.embed.infra.exception.ValidateException;
import org.springframework.beans.BeanUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author 杨翼
 * @since 1.0
 */
@Service
public class TemplateAppService {

    @Resource
    private TemplateService templateService;

    /**
     * 添加一个模板
     *
     * @param addTemplateReq 添加模板请求
     */
    public void addTemplate(AddTemplateReq addTemplateReq) throws ValidateException {
        Template template = new Template();
        BeanUtils.copyProperties(addTemplateReq, template);
        templateService.addTemplate(template);
    }

    /**
     * 修改模板
     *
     * @param updateTemplateReq 修改模板请求
     */
    public void updateTemplate(UpdateTemplateReq updateTemplateReq) throws ValidateException {
        Template template = new Template();
        BeanUtils.copyProperties(updateTemplateReq, template);
        templateService.updateTemplate(template);
    }

    /**
     * 查询模板
     *
     * @param pageReqEntity 分页请求对象
     * @return 模板
     */
    public Page<QueryTemplateResp> queryTemplates(PageQueryEntity<String> pageReqEntity) {
        Page<TemplateBo> templates = templateService.queryTemplates(pageReqEntity);
        List<QueryTemplateResp> content = templates.stream()
                .map(template -> {
                    QueryTemplateResp resp = new QueryTemplateResp();
                    BeanUtils.copyProperties(template, resp);
                    return resp;
                })
                .collect(Collectors.toList());
        return new PageImpl<>(
                content,
                templates.getPageable(),
                templates.getTotalElements()
        );
    }

    /**
     * 判断模板编号是否存在
     *
     * @param code 编号
     * @return 判断结果
     */
    public boolean checkTemplateCodeExists(String code) {
        return templateService.checkTemplateCodeExists(code);
    }

    /**
     * 删除模板
     *
     * @param id 模板id
     */
    public void deleteTemplate(Long id) {
        templateService.deleteTemplate(id);
    }

    /**
     * 根据编号查询单个template
     *
     * @param code 编号
     * @return template
     */
    public QueryTemplateResp querySingleTemplate(String code) {
        Template template = templateService.querySingleTemplate(code);
        QueryTemplateResp queryTemplateResp = new QueryTemplateResp();
        BeanUtils.copyProperties(template, queryTemplateResp);
        return queryTemplateResp;
    }

    /**
     * 上传模板文件
     *
     * @param file 文件
     * @return 文件存储名称
     */
    public String uploadTemplateFile(MultipartFile file) throws IOException {
        return templateService.uploadTemplateFile(file);
    }

    /**
     * 下载模板文件
     *
     * @param fileStoreName 文件存储名称
     * @return 输入流
     */
    public FileEntity downloadTemplateFile(String fileStoreName) throws IOException, ValidateException {
        return templateService.downloadTemplateFile(fileStoreName);
    }
}
